/**
 * @file main.cpp
 * @brief 游戏服务器主程序入口
 * @details 负责初始化和管理服务器的主要组件，包括：
 *          - 信号处理（处理Ctrl+C等终止信号）
 *          - 日志系统初始化
 *          - 配置加载
 *          - 数据库连接（MySQL和Redis）
 *          - WebSocket服务器
 */

#include "core/server.hpp"
#include "config/config.hpp"
#include "utils/logger.hpp"
#include "database/mysql_manager.hpp"
#include "database/redis_manager.hpp"
#include <signal.h>
#include <unistd.h>  // 添加这行来获取进程ID
#include <iostream>

namespace {
    // 全局运行状态标志，用于控制服务器主循环
    volatile sig_atomic_t g_running = 1;

    /**
     * @brief 信号处理函数
     * @param signum 信号编号
     * @details 处理SIGINT（Ctrl+C）和SIGTERM信号，实现优雅关闭
     */
    void signalHandler(int signum) {
        if (signum == SIGINT || signum == SIGTERM) {
            g_running = 0;
        }
    }
}

/**
 * @brief 主函数
 * @return int 程序退出码（0表示正常退出）
 */
int main() {
    // 注册信号处理器，捕获Ctrl+C和终止信号
    signal(SIGINT, signalHandler);
    signal(SIGTERM, signalHandler);

    // 初始化日志系统
    Logger::getInstance().init("logs/game_server.log");
    auto& logger = Logger::getInstance();

    // 打印进程ID，方便管理
    pid_t pid = getpid();
    logger.info("Server starting with PID: {}", pid);
    std::cout << "Server starting with PID: " << pid << std::endl;

    // 加载配置文件
    Config::getInstance().load("config/config.json");

    // 初始化MySQL数据库连接
    if (!MySQLManager::getInstance().init()) {
        logger.error("Failed to initialize MySQL connection");
        return 1;
    }

    // 初始化Redis连接
    if (!RedisManager::getInstance().init()) {
        logger.error("Failed to initialize Redis connection");
        return 1;
    }

    // 初始化WebSocket服务器
    if (!Server::getInstance().init()) {
        logger.error("Failed to initialize WebSocket server");
        return 1;
    }

    // 服务器初始化完成，打印提示信息
    logger.info("Game server initialized successfully");
    std::cout << "Game server initialized successfully. Use 'kill " << pid << "' to stop the server." << std::endl;
    
    // 主循环：运行直到收到终止信号
    // while (g_running) {
    //     Server::getInstance().runOnce();  // 执行一次服务器循环
    //     std::this_thread::sleep_for(std::chrono::milliseconds(10));  // 防止CPU占用过高

    //     if (!g_running) {
    //         Logger::getInstance().info("Received shutdown signal, stopping server...");
    //         Server::getInstance().stop();
    //         break;
    //     }
    // }

    Server::getInstance().setShutdownCallback([&]() {
        Logger::getInstance().info("Received shutdown signal, stopping server...");
        Server::getInstance().stop();
    });

    Server::getInstance().run();

    // 开始关闭流程
    logger.info("Server shutdown initiated");

    // 清理资源
    RedisManager::getInstance().cleanup();
    MySQLManager::getInstance().cleanup();
    
    logger.info("Server shutdown complete");
    return 0;
} 